package cn.itcast.bos.action.base;

import java.util.HashMap;
import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;

import cn.itcast.bos.domain.base.Standard;
import cn.itcast.bos.service.base.StandardService;
import cn.itcast.fore.web.action.common.BaseAction;

@Controller // bean组件
@Scope("prototype") // 多例
// @Namespace("/") // 命名空间，访问路径
// @ParentPackage("struts-default") // 父包
// @ParentPackage("json-default") // json父包
public class StandardAction extends BaseAction<Standard> {

	private Standard standard = new Standard();
	@Autowired
	private StandardService standardService;

	// @Override
	// public Standard getModel() {
	// // TODO Auto-generated method stub
	// return standard;
	// }

	@Action(value = "standard_add"// action访问的名字
			, results = {
					// @Result(name="success",type="redirect",location="/pages/base/standard.html")
					// @Result(name=SUCCESS,type="redirect",location="/pages/base/standard.html")
					// @Result(type="redirect",location="/pages/base/standard.html")
					@Result(type = REDIRECT, location = "/pages/base/standard.html") })
	public String add() {
		// 调用业务保存数据
		standardService.addStandard(model);
		return SUCCESS;

	}

	private int page;
	private int rows;

	public void setPage(int page) {
		this.page = page;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	// 分页列表查询：返回json对象
	@Action(value = "standard_listpage")
	public String listPage() {

		// 请求的分页bean对象：用来封装请求的分页参数
		// 参数1：当前页码的“索引”Pages are zero indexed, thus
		// providing 0 for page will return the first page.
		// 参数2：每页最大记录数
		Pageable pageable = new PageRequest(page - 1, rows);
		// 调用service
		// 使用技术方案;springdatajpa自带的分页api（总记录数的查询+
		// 当前页数据列表=1）
		// Page<T> findAll(Pageable pageable);
		// 返回page对象：响应的分页bean对象：用来存放查询之后的结果
		Page<Standard> pageResponse = standardService.findStandardListPage(pageable);
		// 构建一个map对象，用来临时存放结果
		HashMap<String, Object> resultMap = new HashMap<>();
		// 总记录数
		resultMap.put("total", pageResponse.getTotalElements());
		// 当前页的数据列表
		resultMap.put("rows", pageResponse.getContent());
		// 要将map转换为json对象，写入响应
		// struts2自带了一个json的转换插件（struts2-json-
		// plugin）：可以自动将对象转换为json，自动将其写入响应。
		// 我们只需要将要转换为json的java对象压入root栈顶即可。
		ActionContext.getContext().getValueStack().push(resultMap);
		// 该json插件是使用是结果集（处理响应）
		// struts2的json插件
		return JSON;

	}

	// 列出所有的标准列表
	@Action(value = "standard_list")
	public String list() {
		// 调用业务层
		List<Standard> standardList = standardService.findStandardList();
		// 目标：要json数组--java一般使用list来转
		// 将list压入root栈顶
		ActionContext.getContext().getValueStack().push(standardList);
		// 返回json类型的结果集上
		return JSON;
	}

}
